package com.example.openanprtest2;

import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Base64;

public class VideoRecorder {
    public static void main(String[] args) throws Exception {
        // 1. 初始化摄像头抓取器
        FrameGrabber grabber = FrameGrabber.createDefault(0); // 摄像头索引为0
        grabber.start();

        // 2. 初始化视频录制器
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(
                "output.mp4",          // 输出文件名
                grabber.getImageWidth(), // 视频宽度（与摄像头分辨率一致）
                grabber.getImageHeight() // 视频高度
        );
        recorder.setFormat("mp4");   // 视频格式（mp4、avi等）
        recorder.setFrameRate(30);   // 帧率（与摄像头帧率一致）
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 编码器（H.264）
        recorder.setVideoBitrate(10 * 1024 * 1024); // 视频比特率（10 Mbps）
        recorder.start();

        // 3. 创建实时显示窗口（可选）
        CanvasFrame canvas = new CanvasFrame("摄像头");
        canvas.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        // 添加键盘监听器
        canvas.getCanvas().addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_S) { // 按下 S 键保存图片
                    try {
                        // 5. 释放资源
                        recorder.close();// 确保视频文件正确关闭
                        grabber.close();
                        canvas.dispose();

                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });


        // 4. 实时捕获并录制
        Frame frame;
        while ((frame = grabber.grab()) != null) {

            if(!canvas.isDisplayable()){//窗口是否关闭
                grabber.stop();//停止抓取
                System.exit(2);//退出
                break;
            }

            // 显示实时画面（可选）
            canvas.showImage(frame);
            // 将帧写入视频文件
            recorder.record(frame);
        }

        // 5. 释放资源
        recorder.close();// 确保视频文件正确关闭 才能播放视频
        grabber.close();
        canvas.dispose();
    }
}